// validationUtils.js
export const checkMobilePattern = /^1[3-9]\d{9}$/


/**
 * 验证电子邮箱格式
 */
export const checkIsEmail = (value) =>
    /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value);

/**
 * 验证手机格式
 */
export const checkIsMobile = (value) =>
  checkMobilePattern.test(value);

/**
 * 验证URL格式
 */
export const checkIsUrl = (value) =>
    /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/.test(value);

/**
 * 验证日期格式
 */
export const checkIsDate = (value) => {
    if (!value) return false;
    // 判断是否数值或者字符串数值(意味着为时间戳)，转为数值，否则new Date无法识别字符串时间戳
    if (checkIsNumber(value)) value = +value;
    return !/Invalid|NaN/.test(new Date(value).toString());
};

/**
 * 验证ISO类型的日期格式
 */
export const checkIsDateISO = (value) =>
    /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);

/**
 * 验证十进制数字
 */
export const checkIsNumber = (value) =>
    /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value);

/**
 * 验证字符串
 */
export const checkIsString = (value) => typeof value === 'string';

/**
 * 验证整数
 */
export const checkIsDigits = (value) => /^\d+$/.test(value);

/**
 * 验证身份证号码
 */
export const checkIsIdCard = (value) =>
    /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(value);

/**
 * 是否车牌号
 */
export const checkIsCarNo = (value) => {
    // 新能源车牌
    const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
    // 旧车牌
    const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
    if (value.length === 7) {
        return creg.test(value);
    }
    if (value.length === 8) {
        return xreg.test(value);
    }
    return false;
};

/**
 * 金额,只允许2位小数
 */
export const checkIsAmount = (value) =>
    /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);

/**
 * 中文
 */
export const checkIsChinese = (value) =>
    /^[\u4e00-\u9fa5]+$/gi.test(value);

/**
 * 只能输入字母
 */
export const checkIsLetter = (value) => /^[a-zA-Z]*$/.test(value);

/**
 * 只能是字母或者数字
 */
export const checkIsEnOrNum = (value) => /^[0-9a-zA-Z]*$/g.test(value);

/**
 * 验证是否包含某个值
 */
export const checkIsContains = (value, param) => value.indexOf(param) >= 0;

/**
 * 验证一个值范围[min, max]
 */
export const checkIsRange = (value, param) => value >= param[0] && value <= param[1];

/**
 * 验证一个长度范围[min, max]
 */
export const checkIsRangeLength = (value, param) => value.length >= param[0] && value.length <= param[1];

/**
 * 是否固定电话
 */
export const checkIsLandline = (value) =>
    /^\d{3,4}-\d{7,8}(-\d{3,4})?$/.test(value);

/**
 * 是否json字符串
 */
export const checkIsJsonString = (value) => {
    if (typeof value === 'string') {
        try {
            const obj = JSON.parse(value);
            if (typeof obj === 'object' && obj) {
                return true;
            }
            return false;
        } catch (e) {
            return false;
        }
    }
    return false;
};

/**
 * 是否短信验证码
 */
export const checkIsCode = (value, len = 6) =>
    new RegExp(`^\\d{${len}}$`).test(value);

/**
 * 是否函数方法
 * @param {Object} value
 */
export const checkIsFunc = (value) => typeof value === 'function';

/**
 * 是否promise对象
 * @param {Object} value
 */
export const checkIsPromise = (value) =>
    checkIsObject(value) && checkIsFunc(value.then) && checkIsFunc(value.catch);

/**
 * 是否图片格式
 */
export const checkIsImage = (value) => {
    const newValue = value.split('?')[0];
    const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
    return IMAGE_REGEXP.test(newValue);
};

/**
 * 是否视频格式
 */
export const checkIsVideo = (value) => {
    const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;
    return VIDEO_REGEXP.test(value);
};

/**
 * 是否为正则对象
 * @return {Boolean}
 * @param o
 */
export const checkIsRegExp = (o) =>
    o && Object.prototype.toString.call(o) === '[object RegExp]';

/**
 * 验证是否为对象
 */
export const checkIsObject = (value) => value !== null && typeof value === 'object';

/**
 * 验证是否为数组
 */
export const checkIsArray = (value) => Array.isArray(value);
